package com.wl.cloud.mbg;

import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: wanglin
 * @date: 2023-09-15 周五
 * @Version: 1.0
 * @Description:
 */
public class CodeUtils {
    /**
     * 配置基础转换器
     *
     * @return
     */
//    private static DataSourceConfig configDataSource() {
        /**数据库链接配置**/
//        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(
//                JDBC_URL_MAN,
//                JDBC_UserName,
//                JDBC_Password
//        )
//                .dbQuery(new MySqlQuery())
//                /**自定义转换器，将tinyint 转换为Integer**/
//                .typeConvert(new EasyMySqlTypeConvert())
//                .keyWordsHandler(new MySqlKeyWordsHandler())
//                .build();
//
//        return dataSourceConfig;
//    }

    /**
     * 自定义转换器转换器 内部类
     * 目的将数据库表中定义的  tinyint 或 bit类型转变为 java Integer 类型
     *
     * @author timerbin
     */
    static class EasyMySqlTypeConvert extends MySqlTypeConvert {
        @Override
        public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
            IColumnType iColumnType = super.processTypeConvert(config, fieldType);
            if (fieldType.equals("tinyint(1)")) {
                iColumnType = DbColumnType.INTEGER;
            }
            if (fieldType.equals("bit(1)")) {
                iColumnType = DbColumnType.BYTE;
            }
            return iColumnType;
        }
    }

    /**
     * 设置全局变量
     *
     * @return
     */
//    private static GlobalConfig configGlobel() {
//
//        GlobalConfig globalConfig = new GlobalConfig.Builder()
//                .fileOverride()
//                .disableOpenDir()
//                /**存放生成文件的文件夹地址**/
//                .outputDir(FILE_STORAGE_FILE_ROOT_PATH)
//                .author(CODE_AUTHOR)
//                .dateType(DateType.ONLY_DATE)
//                .commentDate("yyyy-MM-dd hh:mm:ss")
//                .build();
//        return globalConfig;
//    }

    /**
     * 生成文件存储目录配置
     *
     * @return
     */
//    private static PackageConfig configPackage() {
//        PackageConfig packageConfig = new PackageConfig.Builder()
//                /**存放生成文件的 父级 package 地址**/
//                .parent(FILE_STORAGE_FILE_JAR_PACKAGE)
//                /**存放生成文件的 的 父级模块地址**/
//                .moduleName(FILE_STORAGE_FILE_JAR_PACKAGE_MODULE)
//                /**存放生成文件的 service 接口 存放的package地址**/
//                .service(FILE_STORAGE_SERVICE_FILE_JAR_PACKAGE)
//                /**存放生成文件的 service 接口实现类 存放的package地址**/
//                .serviceImpl(FILE_STORAGE_SERVICE_IMPL_FILE_JAR_PACKAGE)
//                /**存放生成文件的 实体类 存放的package地址**/
//                .entity(FILE_STORAGE_ENTITY_FILE_JAR_PACKAGE)
//                /**存放生成文件的 mapper 操作类 存放的package地址**/
//                .mapper(FILE_STORAGE_MAPPER_FILE_JAR_PACKAGE)
//                /**存放生成文件的 mapper 操作类 xml 存放的package地址**/
//                .xml(FILE_STORAGE_MAPPER_XML_FILE_JAR_PACKAGE)
//                /**存放生成文件的 其他实体类 存放的package地址**/
//                .other(FILE_STORAGE_OTHER_FILE_JAR_PACKAGE)
//                .build();
//        return packageConfig;
//    }

    /**
     * 生成文件的策略配置
     *
     * @return
     */
//    private static StrategyConfig configStratgy() {

        /**
         * 初始化配置
         *      策略中实体字段的默认填充装置
         *
         */
//        List<IFill> tableFillList = makeInitTableFills();


//        StrategyConfig strategyConfig = new StrategyConfig.Builder()
//                .addInclude(Tables)
//
//                .entityBuilder()//开始定制实体
//                /***禁用生成 serialVersionUID**/
//                // .disableSerialVersionUID()
//                .enableActiveRecord()
//                .enableLombok()
//                .enableRemoveIsPrefix()
//                .enableTableFieldAnnotation()
//                .enableChainModel()
//                .naming(NamingStrategy.underline_to_camel)
//                .columnNaming(NamingStrategy.underline_to_camel)
//                /***逻辑删除字段名(数据库)**/
////                .logicDeleteColumnName("yn")
//                .addTableFills(tableFillList)
//                .idType(IdType.AUTO)
//                /**格式化实体类文件名称***/
//                //.formatFileName("%sEntity")
//
//                .serviceBuilder()//开始定制Service，由于我们不需要service此处略
//                /***格式化 service 接口文件名称**/
//                .formatServiceFileName("%sService")
//                .formatServiceImplFileName("%sServiceImpl")
//
//                .mapperBuilder()//开始定制映射器
//                .enableMapperAnnotation()
//                .superClass(BaseMapper.class)
//                .enableBaseColumnList()
//                .enableBaseResultMap()
//                .formatMapperFileName("%sMapper")
//                .formatXmlFileName("%sMapper")
//
//                .build();
//        return strategyConfig;
//    }

    /**
     * 类生成策略
     * 配置字段默认填充装置
     *
     * @return
     */
//    private static List<IFill> makeInitTableFills() {
//        List<IFill> tableFillList = new ArrayList<>();
//        /**定义创建时间 插入时默认填充**/
//        Column createTableFill = new Column("created", FieldFill.INSERT);
//        /** 定义修改时间 插入或修改时默认填充**/
//        Column updateTableFill = new Column("modified", FieldFill.INSERT_UPDATE);
//        tableFillList.add(createTableFill);
//        tableFillList.add(updateTableFill);
//
//        return tableFillList;
//    }

    /**
     * 设置其他模板
     *
     * @return
     */
//    private static TemplateConfig configTemplate() {
//        TemplateConfig templateConfig = new TemplateConfig.Builder()
//                .controller(null)//我不需要controller 此处传null
//                .service(null)//我不需要service  此处传null
//                .serviceImpl(null)//我不需要service impl 此处传null
//                .build();
//        return templateConfig;
//    }

    /**
     * @return
     */
    private static void initInjectionConfig() {
        /**自定义生成模板参数**/
        Map<String, Object> paramMap = new HashMap<>();

        /** 自定义 生成类**/
        Map<String, String> customFileMap = new HashMap<>();
        /**PO实体**/
        customFileMap.put("po" + File.separator + "%sPO.java", "/templates/PO.java.vm");
        /**Vo实体**/
        customFileMap.put("vo" + File.separator + "%sVO.java", "/templates/VO.java.vm");
        /**DTO实体**/
        customFileMap.put("dto" + File.separator + "%sDTO.java", "/templates/DTO.java.vm");

//        return new InjectionConfig.Builder()
//                .customMap(paramMap)
//                .customFile(customFileMap)
//                .build();
    }
}
